import sys
import common

#if len(sys.argv)<2:
#     print("usage:")
#     exit(0)

myfile = open('dex-layout.txt', "r")

l=[]
ll=[]

for line in (myfile):
	s=line.strip(' \t\n')
	if len(s)<1:
		continue
		
	if s.startswith('#'):
		continue
	
	s1=s.split('\t')
	#print(s1)

	

	ll.append(s1)

print('''
#include "util.h"
#include "dex-file.h"
//#include "class-defs.h"

void CDexFile::print()
{
	GetHeader()->print();
''')
	
for x in ll:
	n=x[0]
		
	if n.endswith('_ids'):
		print('\tfor(int i=0;i<Get%sSize();i++){'%(common.get_name(n)))
		print('\t\tprintf("\\n%s [%%d]:\\n",i);'%(common.get_var_label(n)))			
		print('\t\tGet%s()[i].print();'%(common.get_name(n)))	
		print('\t}')
	elif x[1].startswith('ubyte'):
		print('\tprintf("\\n%s(%%d bytes):\\n",Get%sSize());'%(common.get_var_label(n),common.get_name(n)))		
		print('\tprint_mem32((char*)Get%sAddr(),0,Get%sSize());'%(common.get_name(n),common.get_name(n)))
	elif n!='header':
		print('\tchar *p=(char *)Get%sAddr();'%(common.get_name(n)))
		print('\tfor(int i=0;i<Get%sSize();i++){'%(common.get_name(n)))
		print('\t\tprintf("\\n%s [%%d]:\\n",i);'%(common.get_var_label(n)))			
		print('\t\t((%s*)p)->print();'%(common.get_cls_name(n)))			
		print('\t\tp+=((%s*)p)->Size();'%(common.get_cls_name(n)))			
		print('\t}')		
print('''
}
	''')
print('''	
int CDexFile::sprint(char * buffer)
{
	int len;
	len=GetHeader()->sprint(buffer);
''')
	
for x in ll:
	n=x[0]
		
	if n.endswith('_ids'):
		print('\tfor(int i=0;i<Get%sSize();i++){'%(common.get_name(n)))
		print('\t\tlen+=sprintf(buffer+len,"%s [%%d]:\\n",i);'%(common.get_var_label(n)))			
		print('\t\tlen+=Get%s()[i].sprint(buffer+len);'%(common.get_name(n)))	
		print('\t}')
	elif x[1].startswith('ubyte'):
		print('\tlen+=sprintf(buffer+len,"%s(%%d bytes):\\n",Get%sSize());'%(common.get_var_label(n),common.get_name(n)))		
		print('\tlen+=sprint_mem32(buffer+len,0,(char*)Get%sAddr(),Get%sSize());'%(common.get_name(n),common.get_name(n)))
	elif n!='header':
		print('\tchar *p=(char *)Get%sAddr();'%(common.get_name(n)))
		print('\tfor(int i=0;i<Get%sSize();i++){'%(common.get_name(n)))
		print('\t\tlen+=sprintf(buffer+len,"%s [%%d]:\\n",i);'%(common.get_var_label(n)))			
		print('\t\tlen+=((%s*)p)->sprint(buffer+len);'%(common.get_cls_name(n)))			
		print('\t\tp+=((%s*)p)->Size();'%(common.get_cls_name(n)))			
		print('\t}')		
print('''
	return len;
}
	''')	